extern irqreturn_t smp_reschedule_interrupt(int, void *, struct pt_regs *);
extern irqreturn_t smp_call_function_interrupt(int, void *, struct pt_regs *);
-void __init smp_intr_init(void)
+void smp_intr_init(void)
{
int cpu = smp_processor_id();
smp_call_function_interrupt,
SA_INTERRUPT, callfunc_name[cpu], NULL));
}
+
+static void smp_intr_exit(void)
+{
+ int cpu = smp_processor_id();
+
+ free_irq(per_cpu(resched_irq, cpu), NULL);
+ unbind_ipi_from_irq(RESCHEDULE_VECTOR);
+
+ free_irq(per_cpu(callfunc_irq, cpu), NULL);
+ unbind_ipi_from_irq(CALL_FUNCTION_VECTOR);
+}
+
+void smp_suspend(void)
+{
+ smp_intr_exit();
+}
+
+void smp_resume(void)
+{
+ smp_intr_init();
+}
#define gnttab_resume() do{}while(0)
#endif
+#ifdef CONFIG_SMP
+ extern void smp_suspend(void);
+ extern void smp_resume(void);
+#endif
extern void time_suspend(void);
extern void time_resume(void);
extern unsigned long max_pfn;
time_suspend();
+#ifdef CONFIG_SMP
+ smp_suspend();
+#endif
+
xenbus_suspend();
ctrl_if_suspend();
xenbus_resume();
+#ifdef CONFIG_SMP
+ smp_resume();
+#endif
+
time_resume();
blkdev_resume();